package com.hibernate.crud;

import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;

import com.hibernate.domain.Person;

/**
 * 完成person的crud操作
 * @author LC
 *
 */
public class PersonCrud {
	
	/**
	 * 完成数据表的crud操作步骤
	 * 		1、创建配置文件对象configuration
	 * 			Configuration configuration = new Configuration() ;
	 * 		2、加载配置文件
	 * 			1、configuration.configure() ;	//必须把配置文件放在classpath的根目录下，默认为/hibernate.cfg.xml
	 * 			2、configuration.configure(url) ;	//通过url的方式根据指定的路径加载配置文件
	 * 		3、创建sessionFactory
	 * 			SessionFactory sessionFactory = configuration.buildSessionFactory() ;
	 * 		4、打开一个session
	 * 			Session session = sessionFactory.openSession() ;
	 * 		5、开启事务
	 * 		6、完成crud操作
	 * 		7、提交事务
	 * 		8、关闭session
	 */
	
	/**
	 * crud测试01：save操作
	 */
	@Test
	public void testSavePerson() {
		//加载hibernate配置文件hibernate.cfg.xml
		Configuration configuration = new Configuration() ;
		configuration.configure() ;
		//创建sessionFactory
		SessionFactory sessionFactory = configuration.buildSessionFactory() ;
		//打开一个session
		Session session = sessionFactory.openSession() ;
		//开启事务
		Transaction transaction = session.beginTransaction() ;
		//保存person信息
		Person person = new Person() ;
		person.setName("李四") ;
		person.setDescription("霸气") ;
		session.save(person) ;
		//提交事务
		transaction.commit() ;
		//关闭session链接
		session.close() ;
	}
	
	/**
	 * crud测试02：update操作
	 * 		根据主键从数据库中查询一条记录
	 * 			Person person = (Person)session.get(Person.class, 1L) ;
	 * 				clazz参数：持久化类的class形式
	 * 				id：主键的值
	 * 		修改信息，执行更新操作
	 */
	@Test
	public void testUpdatePerson() {
		Configuration configuration = new Configuration() ;
		configuration.configure() ;
		SessionFactory sessionFactory = configuration.buildSessionFactory() ;
		Session session = sessionFactory.openSession() ;
		Transaction transaction = session.beginTransaction();
		/**
		 * 更新指定的记录
		 * 		1、根据id把记录查询出来
		 * 			Person person = (Person)session.get(Person.class, 1L) ;
		 * 				clazz参数：持久化类的class形式
		 * 				id：主键的值
		 * 		2、修改持久化对象的信息
		 */
		Person person = (Person)session.get(Person.class, 1L) ;
		person.setName("张三01") ;
		session.update(person) ;
		transaction.commit() ;
		session.close() ;
	}
	
	/**
	 * crud测试03：查询操作
	 * 		查询数据库中的所有记录
	 * 			List<Person> persons = session.createQuery("from Person").list() ;
	 */
	@Test
	public void testFindAllPerson() {
		Configuration configuration = new Configuration() ;
		configuration.configure() ;
		SessionFactory sessionFactory = configuration.buildSessionFactory() ;
		Session session = sessionFactory.openSession() ;
		List<Person> persons = session.createQuery("from Person").list() ;
		for (Person person : persons) {
			System.out.println(person);
		}
		session.close() ;
	}
	
	/**
	 * crud测试04：删除操作
	 */
	@Test
	public void testDeletePerson() {
		Configuration configuration = new Configuration() ;
		configuration.configure() ;
		SessionFactory sessionFactory = configuration.buildSessionFactory() ;
		Session session = sessionFactory.openSession() ;
		Transaction transaction = session.beginTransaction() ;
		/**
		 * 删除指定的记录
		 * 		1、根据id把记录查询出来
		 * 			Person person = (Person)session.get(Person.class, 2L) ;
		 * 		2、执行删除操作
		 * 			session.delete(person) ;
		 */
		Person person = (Person)session.get(Person.class, 2L) ;
		session.delete(person) ;
		transaction.commit() ;
		session.close() ;
	}
	
	
	

}
